package com.thp.bigdata.wcdemo;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
/**
 * KEYIN : 默认情况下是mr框架所读到的一行文本的起始偏移量  (默认是一行一行读取数据,读到一行就把起始偏移量传递到KEYIN里面)   -- Long
 * VALUEIN : 默认情况下是mr框架所读到一行文本的内容     --  String
 * KEYOUT : 是用户自定义逻辑处理完成之后输出数据中的key,   是我们自己来决定的  在此处是单词  -- String
 * VALUEOUT : 是用户自定义逻辑处理完成之后输出数据的value    在此处是单词次数  -- Integer
 * @author 汤小萌
 *
 */

/**
 * 我们要输出的数据,需要经过网络传输,既然要经过网络传输,那么这写数据就需要经过序列化
 * 使用Serializable 进行序列化,比较冗余,会将类的继承信息全部序列化
 * 但是在这里我们只需要将对象里面的数据进行序列化就可以
 * hadoop里面有一个自己的序列化框架  --  更加精简   Long - LongWritable  String - Text  Integer - IntWritable
 * @author 汤小萌
 *
 */
public class WordcountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{
	/**
	 * map阶段的业务逻辑就写在自定义的map()方法中
	 * maptask会对每一行输入数据调用一次我们自定义的方法
	 * key 是偏移量,对我进行业务逻辑的处理是没有用的
	 */
	@Override
	protected void map(LongWritable key, Text value, Context context)
			throws IOException, InterruptedException {
		// 将maptask传递给我们的文本内容转换成String
		String line = value.toString();
		// 根据空格将这一行切分单词
		String[] words = line.split(" ");
		// 输出的是  <单词, 1>
		for(String word : words) {
			// 将单词作为key,将次数1作为value,以便于后续的数据分发,可以根据单词分发,以便于相同的单词会到想的reduce task
			context.write(new Text(word), new IntWritable(1));
			// 为了显示效果而输出Mapper的键值对信息
			System.out.println("Mapper的输出 ： < " + word + ", 1 >" );
		}
	}
}
